package my.mark.mybaibaoxiang.jichu;

import java.util.*;

/**
 * @Description TODO.
 * set接口是Collection接口的一个子接口，无序，没有重复。
 * set分HashSet和TreeSet。
 * set中默认不包含重复的元素，也就是说set中不存在两个这样的元素a1.equals(a2)结果为true。
 *
 * TODO TreeSet：默认没有重复，默认升序。但可重写Comparator使排序倒转或者可以有重复值。
 * TreeSet类使用了一个TreeMap。
 *
 * HashSet：可以放入null，但只能放入一个null，即默认没有重复。 TreeSet：不允许放入null值。
 一、实现方式
HashSet：baiHashSet是哈希表实现的。
TreeSet：TreeSet是二差树实现的。

二、数据是否有序
HashSet：HashSet中的数据是无序的。
TreeSet：Treeset中的数据是自动排好序的。

三、是否可以放入null值
HashSet：可以放入null，但只能放入一个null。 
TreeSet：不允许放入null值。

 * @author wxming.
 * @date 2020-9-17.
 */
public class SetTest {

    public static void main(String[] args) {

        Set<String> set = new HashSet<String>();
        set.add("xet");
        set.add("jpo");
        set.add("wo");
        set.add("jpo");
        System.out.println(set);

        Set<String> softset = new TreeSet<String>(set);
        System.out.println(softset);

        //TODO 直接把list放到TreeSet里变成有序的，但不能同时有字符串和数值，set无法区分默认按哪种比较。
        List list = new ArrayList();
        /*list.add("asd");
        list.add("bcd");
        list.add("ghi");*/
        list.add(123);
        list.add(999);
        list.add(88);
        Set listToSet = new TreeSet(list);
        System.out.println(listToSet);

        Set<Integer> intSet = new TreeSet<>();
        intSet.add(999);
        intSet.add(1);
        intSet.add(8);
        intSet.add(266);
        intSet.add(266);
        intSet.add(266);
        intSet.add(16);
        intSet.add(5);
        intSet.add(20);
        System.out.println(intSet);

        Set<Integer> intSetDaoxu = new TreeSet<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                //TODO return 0;//如果直接返回0，则结果intSetDaoxu里只有放进去的第一个值999。
                //TODO 源码本身实现 return (x < y) ? -1 : ((x == y) ? 0 : 1);
                int num = o1.compareTo(o2);
                //return num ==0?1:num;//TODO 如果将相等为0设为1，则重复值也会存在。[1, 5, 8, 16, 20, 266, 266, 266, 999]
                return -num;//TODO 将默认比较结果倒转返回，则可以将TreeSet的默认正序改为倒序。
            }
        });
        intSetDaoxu.add(999);
        intSetDaoxu.add(1);
        intSetDaoxu.add(8);
        intSetDaoxu.add(266);
        intSetDaoxu.add(266);
        intSetDaoxu.add(266);
        intSetDaoxu.add(16);
        intSetDaoxu.add(5);
        intSetDaoxu.add(20);
        System.out.println(intSetDaoxu);
        //TODO TreeSet的迭代循环取值。
        intSetDaoxu.iterator();
        Iterator it = intSetDaoxu.iterator();
        while(it.hasNext()){
            System.out.println(it.next()+"；");
        }
    }
    /**
     * 运行结果：
     [xet, jpo, wo]
     [jpo, wo, xet]
     [1, 5, 8, 16, 20, 266, 999]
     [999, 266, 20, 16, 8, 5, 1]
     999；
     266；
     20；
     16；
     8；
     5；
     1；
     */

}
